c cpp convert, char char a
对于这一块,fawks大神毫无疑问已经到了一个境界了,我还是个学习的菜鸟。
我当时学的时候,就觉得里面的语法太复杂了,而且各种陷阱,一不小心就掉到坑里去了。。。
先来两个case:
char* a="fawks"
char a[]="fawks"
下面本文从几个方面来比较区别
两个的是前者a是字符串指针,后者a是字符数组。具体的来说,两者都会在常量区(常量区,堆,栈(通常说的堆栈), 全局\静态存储区)申请一个空间存放fawks这个字符串,
然后前者在栈申请一个空间存放字符串指针a,*86 占4B,值为这块常量区的首地址,但是如果cout<<a的时候又会输出这个字符串,而不会输出a的地址,之前李青老师的书记得写过,这是
C++的智能处理,包括输出字符数组首地址也是自动输出字符串内容。后者则是将常量区字符串copy到一个栈,然后首地址就是a的地址,这个是字符数组。并且要注意前者最好是写成const char*a =”fawks”
因为不能通过a来修改字符串所在常量区的值,所以const会比较安全,但是后面修改a的指向又是可以的。
后面继续赋值:
a=”zrc”
这句话对于前者是可以的,因为把栈中指针a的值改为zrc的地址,a指向了常量区另一个区域zrc的首地址,而后者是不可以的,因为a已经固定下来了指向一个栈中fawks的首地址,字符数组只能初始化不能赋值。
- 另外还有一个区别要注意
sizeof(a);
这句话对于前者输出4(*86),因为这个指针占得空间是4个字节,因为32bit地址,8bit占一个Byte,如果字节寻址的话(一般这么理解),所以占4个存储单元。而后者则是输出5,注意与strlen(a)的区别,
因为sizeof()是看占得内存空间大小,所以包含结束符\0(ASCII 0), strlen是字符串长度,不包含结束符。
4.所以如果函数返回一个char, 如果你定义的char a[]=””, 然后return a就会挂,虽然过程是先返回了a指向的地址,然后再结束函数,但是这块是栈空间,函数结束就销毁了这块栈,所以位置是野值。。。
而后者是字符串存在常量去,随着程序开始就在那直到程序结束,所以chara =””, return a完全没问题,而且函数先返回,后销毁栈变量也保证了他的正确性,a是栈中的一个指针变量。
- 数组(char a[])可以转化为指针(char* a),指向字符串的指针,但是指针未必可以转为数组,因为如果指向字符串常量的话,那么就不能作为数组了,因为没法修改它们的值。
另外要注意字符串常量如果赋值(不是初始化)给char* 可能有警告,例如
char *s;
s="hello";
但是char* s=”hello” 是可以的,其实还是加个const安全些。附上
string str=(char*)s;
char *s=str.c_str();
上面一句可以,二句不可以的,因为c_str()返回const char ,不可以const char 赋给char*, 但是反过来可以,我付给一个保证不修改内容的指针的嘛
const char* s=(char*)cstr;
引用 http://www.zhihu.com/question/20779337
http://blog.csdn.net/hackbuteer1/article/details/6706562